package main

/**
字典：
	1、（Map类型）：由若干个key:value这样的键值对映射组合在一起的数据结构
	2、它是哈希表的一个实现，这就要求它的每个映射里的key，都是唯一的，可以使用 == 和 != 来进行判等操作，换句话说就是key必须是可哈希的。
	3、在声明字典时，必须指定好你的key和value是什么类型的，然后使用 map 关键字来告诉Go这是一个字典。
*/
import (
	"fmt"
)

func main() {

	/**
	字典声明的3种方式
	*/
	// 第1种
	var scores_1 map[string]int = map[string]int{"English": 80, "Chinese": 90}
	fmt.Println(scores_1)

	// 第2种
	scores_2 := map[string]int{"学校ID": 100, "班级号": 102}
	fmt.Println(scores_2)

	// 第3种
	scores_3 := make(map[string]int)
	scores_3["楼编号"] = 1
	scores_3["楼层"] = 2
	fmt.Println(scores_3)

	/**
	输出结果:
			map[Chinese:90 English:80]
			map[学校ID:100 班级号:102]
			map[楼层:2 楼编号:1]
	*/
	fmt.Println("=========================================================")

	// 声明一个名是 scores的字典
	var scores map[string]int
	// 未初始化的 scores 的零值是nil，无法直接进行赋值
	if scores == nil {
		// 使用make函数对其初始化
		scores = make(map[string]int)
	}
	// 经过初始化之后，可以直接赋值
	scores["编号"] = 100
	fmt.Println(scores)

	/**
	输出结果:
			map[编号:100]
	*/
	fmt.Println("=========================================================")

	/**
	字典的操作
	*/
	// 1、添加元素
	scores["math"] = 100
	fmt.Println(scores["math"])
	// 2、修改元素（直接赋值更新value）
	scores["math"] = 101
	fmt.Println(scores["math"])
	// 3、删除操作
	delete(scores, "math")
	fmt.Println("=========================================================")

	/*
		判断key是否存在
		（1）当key不存在，会返回value-type的零值，所以不能通过返回的结果是否是零值来判断对应的key是否存在，因为key对应的value值也可能是零值

		（2）字典的下标读取，其实可以返回两个值，使用第二个返回值表示对应的key是否存在，如果存在OK，是true，不存在是false。
	*/
	scores_4 := map[string]int{"英语": 80, "语文": 85}
	m, ok := scores_4["数学"]
	if ok {
		fmt.Printf("数学的值是： %d", m)
	} else {
		fmt.Println("数学 不存在")
	}
	fmt.Println("=========================================================")

	/**
	字典进行遍历循环（3种方式）
	*/
	// 第1种
	scores_5 := map[string]int{"英语": 80, "语文": 85}
	for subject, score := range scores_5 {
		fmt.Printf("key: %s, value: %d\n", subject, score)
	}

	// 第2种（只获取key）
	scores_6 := map[string]int{"英语": 81, "语文": 86}
	for subject_6 := range scores_6 {
		fmt.Printf("key: %s\n", subject_6)
	}

	// 第3种（只获取value）
	scores_7 := map[string]int{"英语": 82, "语文": 87}
	// （_, score_7）可以理解表示（key, value）
	for _, score_7 := range scores_7 {
		fmt.Printf("value: %d\n", score_7)
	}
}
